home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
EnigmA Amiga Run 1996 February
/
EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso
/
earcd
/
comm2
/
kms20src.lha
/
KMSS
/
server.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-09-24
|
57KB
|
2,092 lines
/**********************************
* KMS *
**********************************/
/*************************************************************************
*
* Copyright (C) 1995 Thomas Schwarz
* <kmshq@ruatha.muc.de>
* <Schwarz.Thomas@fhm.de>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*
*************************************************************************/
#include <KMS/KMS.h>
#include <KMS/KMS_devlib.h>
#include "KMSServer_rev.h"
/* A handy macro to access AbsExecBase. */
#define SysBase (*(struct ExecBase **)4L)
Prototype UWORD Break(VOID);
Prototype VOID main(UWORD, STRPTR *);
Prototype UBYTE OpenLib(VOID);
Prototype BOOL GetData(VOID);
Prototype VOID GetCharTable(UBYTE);
Prototype BOOL ReadUserList(VOID);
Prototype BOOL WriteUserList(VOID);
Prototype BOOL ReadAreaList(VOID);
Prototype BOOL WriteAreaList(VOID);
Prototype BOOL ReadAccessList(VOID);
Prototype BOOL WriteAccessList(VOID);
Prototype VOID SaveData(VOID);
Prototype VOID ReadSysDat(VOID);
Prototype VOID WriteSysDat(VOID);
Prototype BOOL WaitUntilAlone(VOID);
Prototype VOID Sense(UBYTE);
Prototype VOID Out(STRPTR);
Prototype STRPTR GetSysMsgLine(STRPTR, STRPTR, UWORD);
Prototype BOOL InitAreaFile(VOID);
Prototype BOOL InitUAF(VOID);
Prototype struct KMSBase *GetKMSBase(VOID);
/*****************************
* Externe Globale Variablen *
*****************************/
extern struct IntuitionBase *IntuitionBase;
extern struct GfxBase *GfxBase;
extern struct rexxCommandList RCL[];
extern STRPTR KMSTitle;
/*********************
* Globale Variablen *
*********************/
/* Diverse */
struct KMSBase *KMSBase = NULL;
UMSAccount SysUMSAccount = 0;
UBYTE ShutDown = 0;
/* Rexx-Port-Signalbit */
ULONG RexxSignal = 0;
/* Name unseres Rexx-Port */
STRPTR RexxPortName = "KMS";
STRPTR RexxExtension = "KMS";
STRPTR ServerPort = "KMSServer";
BPTR StdOut = NULL;
/******************************************
* Break-Handler *
******************************************
* I: --- *
* O: 0 *
******************************************/
/// "Break"
UWORD Break(VOID)
{
return 0;
}
///
/******************************************
* Hauptprogramm *
******************************************
* I: --- *
* O: --- *
******************************************/
/// "main"
VOID main(UWORD argc, STRPTR *argv)
{
onbreak(Break);
Forbid();
if (FindPort(ServerPort))
{
Permit();
exit(20);
}
else
CreatePort(ServerPort, 0);
Permit();
StdOut = (BPTR)Open("CON:0/10//100/KMSServer Error/CLOSE/AUTO/WAIT", MODE_OLDFILE);
if (OpenLib())
Sense(20);
if (!GetKMSBase())
Sense(20);
/* Rexx-Port einrichten */
if (!(RexxSignal = upRexxPort(RexxPortName, RCL, RexxExtension, &KMSRexxDisp)))
{
Out("FATAL ERROR: couldn't upRexxPort(\"KMS\")");
Sense(20);
}
printf(VERS" -*- ©1994 Thomas Schwarz\n");
while(!ShutDown)
{
ULONG signal = Wait(RexxSignal | SIGBREAKF_CTRL_C);
if (signal & SIGBREAKF_CTRL_C)
{
SendPortCmd("SHUTDOWN");
ShutDown = SHUTDOWN_IMMEDIATE;
}
else
dispRexxPort();
}
WaitUntilAlone();
Sense(0);
}
///
/*******************************************
* Öffnen der Libraries *
*******************************************
* I: --- *
* O: Fehlercode *
*******************************************/
/// "OpenLib"
UBYTE OpenLib(VOID)
{
if (SysBase->LibNode.lib_Version < 37)
{
Out("FATAL ERROR: AmigaOS >=2.04 needed");
return 1;
}
return 0;
}
///
/***************************************
* Text-Data aus KMS_SYSTEM.TXT lesen *
***************************************
* I: --- *
* O: Erfolg Ja/Nein *
***************************************/
/// "GetData"
BOOL GetData(VOID)
{
TEXT buff[LEN_MSGHEAD+LEN_MOREPRMT+3+1];
UBYTE n;
TEXT dos[LEN_DOSPATH+1];
LONG sysmsgsize;
BPTR mylock;
struct FileInfoBlock *fileinfo = (struct FileInfoBlock *)AllocVec(sizeof(struct FileInfoBlock), MEMF_CLEAR);
if (!fileinfo)
{
Out("FATAL ERROR: out of memory");
return FALSE;
}
/* System-Msg-Datei oeffnen */
strcpy(dos, KMSBase->TxtDir);
strcat(dos, "KMS_SYSTEM.TXT");
if (mylock = Lock(dos, ACCESS_READ))
{
if(Examine(mylock, fileinfo))
{
sysmsgsize = fileinfo->fib_Size;
if (!sysmsgsize)
{
Out("FATAL ERROR: couldn't get size of KMS_SYSTEM.TXT");
UnLock(mylock);
FreeVec(fileinfo);
return FALSE;
}
}
UnLock(mylock);
}
else
{
Out("FATAL ERROR: couldn't lock KMS_SYSTEM.TXT");
FreeVec(fileinfo);
return FALSE;
}
FreeVec(fileinfo);
KMSBase->SysMsgs = AllocVec(sysmsgsize + 1, MEMF_PUBLIC);
if (!KMSBase->SysMsgs)
{
Out("FATAL ERROR: out of memory");
return FALSE;
}
mylock = Open(dos, MODE_OLDFILE);
if (!mylock)
{
Out("FATAL ERROR: couldn't open KMS_SYSTEM.TXT");
return FALSE;
}
if (Read(mylock, KMSBase->SysMsgs, sysmsgsize) != sysmsgsize)
{
Out("FATAL ERROR: couldn't read KMS_SYSTEM.TXT");
Close(mylock);
return FALSE;
}
Close(mylock);
KMSBase->SysMsgs[sysmsgsize] = '\0';
/* System-Msg-Offset Tabelle fuellen */
UWORD sysmsg = 0;
TEXT c;
STRPTR sysmsgdat = KMSBase->SysMsgs;
c = *(sysmsgdat++);
while(c > 0 && sysmsg < MAXSYSMSG) /* !EOF */
{
/* Nächste Label-Marke suchen */
while(c != '@' && c > 0)
c = *(sysmsgdat++);
if (c == '@')
{
/* Labelmarke gefunden -> Offset eintragen */
while(c != '\n' && c > 0)
c = *(sysmsgdat++);
KMSBase->SysMsgOffsets[sysmsg++] = (UWORD)(sysmsgdat - KMSBase->SysMsgs);
}
}
if (sysmsg != MAXSYSMSG)
{
Out("FATAL ERROR: Corrupted KMS_SYSTEM.TXT");
return FALSE;
}
/* Jetzt diverse Texte einlesen */
sysmsgdat = KMSBase->SysMsgs + KMSBase->SysMsgOffsets[AREAFLAGS_DATA - 1];
if (!GetSysMsgLine(sysmsgdat, KMSBase->AFlags, strlen(KMSBase->AFlags)))
Out("WARNING: AREAFLAGS_DATA not found");
sysmsgdat = KMSBase->SysMsgs + KMSBase->SysMsgOffsets[YESNO_DATA - 1];
if (!GetSysMsgLine(sysmsgdat, KMSBase->YNText, strlen(KMSBase->YNText)))
Out("WARNING: YESNO_DATA not found");
sysmsgdat = KMSBase->SysMsgs + KMSBase->SysMsgOffsets[MSGLIST_DATA - 1];
if (!GetSysMsgLine(sysmsgdat, buff, LEN_MSGLIST))
{
Out("FATAL ERROR: MSGLIST_DATA not found");
return FALSE;
}
else
KMSBase->MsgListLine = strdup(buff);
if (!KMSBase->MsgListLine)
{
Out("FATAL ERROR: out of memory");
return FALSE;
}
sysmsgdat = KMSBase->SysMsgs + KMSBase->SysMsgOffsets[FILELIST_DATA - 1];
if (!GetSysMsgLine(sysmsgdat, buff, LEN_FILELIST))
{
Out("FATAL ERROR: FILELIST_DATA not found");
return FALSE;
}
else
KMSBase->FileListLine = strdup(buff);
if (!KMSBase->FileListLine)
{
Out("FATAL ERROR: out of memory");
return FALSE;
}
sysmsgdat = KMSBase->SysMsgs + KMSBase->SysMsgOffsets[AREAPATH_DATA - 1];
if (!GetSysMsgLine(sysmsgdat, buff, LEN_AREALIST1))
{
Out("FATAL ERROR: AREAPATH_DATA not found");
return FALSE;
}
else
KMSBase->AreaListPath = strdup(buff);
if (!KMSBase->AreaListPath)
{
Out("FATAL ERROR: out of memory");
return FALSE;
}
sysmsgdat = KMSBase->SysMsgs + KMSBase->SysMsgOffsets[AREAINFO_DATA - 1];
if (!GetSysMsgLine(sysmsgdat, buff, LEN_AREALIST2))
{
Out("FATAL ERROR: AREAINFO_DATA not found");
return FALSE;
}
else
KMSBase->AreaListInfo = strdup(buff);
if (!KMSBase->AreaListInfo)
{
Out("FATAL ERROR: out of memory");
return FALSE;
}
sysmsgdat = KMSBase->SysMsgs + KMSBase->SysMsgOffsets[MSGHEAD_DATA - 1];
if (!(sysmsgdat = GetSysMsgLine(sysmsgdat, buff, LEN_MSGHEAD)))
{
Out("FATAL ERROR: MSGHEAD_DATA not found");
return FALSE;
}
else
KMSBase->MsgHead[0] = strdup(buff);
if (!KMSBase->MsgHead[0])
{
Out("FATAL ERROR: out of memory");
return FALSE;
}
for(n = 1; n < 4; n++)
{
if (!(sysmsgdat = GetSysMsgLine(sysmsgdat, buff, LEN_MSGHEAD)))
{
Out("FATAL ERROR: MSGHEAD_DATA not complete");
return FALSE;
}
else
KMSBase->MsgHead[n] = strdup(buff);
if (!KMSBase->MsgHead[n])
{
Out("FATAL ERROR: out of memory");
return FALSE;
}
}
sysmsgdat = KMSBase->SysMsgs + KMSBase->SysMsgOffsets[MSGINFO_DATA - 1];
if (!(sysmsgdat = GetSysMsgLine(sysmsgdat, buff, LEN_MSGINFO)))
{
Out("FATAL ERROR: MSGINFO_DATA not found");
return FALSE;
}
else
{
strcat(buff, " ");
KMSBase->MsgInfos[0] = strdup(buff);
}
if (!KMSBase->MsgInfos[0])
{
Out("FATAL ERROR: out of memory");
return FALSE;
}
for(n = 1; n < 15; n++)
{
if (!(sysmsgdat = GetSysMsgLine(sysmsgdat, buff, LEN_MSGINFO)))
{
Out("FATAL ERROR: MSGINFO_DATA not complete");
return FALSE;
}
else
{
strcat(buff, " ");
KMSBase->MsgInfos[n] = strdup(buff);
}
if (!KMSBase->MsgInfos[n])
{
Out("FATAL ERROR: out of memory");
return FALSE;
}
}
sysmsgdat = KMSBase->SysMsgs + KMSBase->SysMsgOffsets[MORE_DATA - 1];
if (!GetSysMsgLine(sysmsgdat, buff, LEN_MOREPRMT+3))
Out("WARNING: MORE_DATA not found");
else if (strlen(buff) > 3)
{
strncpy(KMSBase->MoreText, buff, 3);
KMSBase->MoreText[3] = '\0';
strcpy(KMSBase->MorePrompt, buff+3);
}
KMSBase->Yes[0] = KMSBase->YNText[YES];
KMSBase->Yes[1] = '\0';
KMSBase->No[0] = KMSBase->YNText[NO];
KMSBase->No[1] = '\0';
return TRUE;
}
///
/***************************************
* Zeichen-Konvertiertabellen einlesen *
***************************************
* I: Zeichensatz-Nummer *
* O: --- *
***************************************/
/// "GetCharTable"
VOID GetCharTable(UBYTE charset)
{
FILE *file;
TEXT dos[LEN_DOSPATH+1];
TEXT line[82];
UWORD c, cin, cout;
/* Default-Belegung */
for(c = 0; c < 256; c++)
KMSBase->CharIn[charset][c] = KMSBase->CharOut[charset][c] = c;
/* Tabelle einlesen */
sprintf(dos, "%sKMS_CHAR_%d.DAT", KMSBase->DatDir, charset);
if (file = fopen(dos, "r"))
{
c = 0;
while(fgets(line, 82, file))
{
if (line[0] != '\0' && line[0] != '#' && line[0] != ';')
{
cin = cout = 0;
if (sscanf(line, " %hd %hd", &cin, &cout) == 2)
{
KMSBase->CharIn[charset][c] = cin;
KMSBase->CharOut[charset][c] = cout;
}
if (c < 255)
c++;
}
}
fclose(file);
}
}
///
/*********************************
* Userdatei lesen *
* (Nur bei Programmstart) *
*********************************
* I: --- *
* O: Erfolg TRUE/FALSE *
*********************************/
/// "ReadUserList"
BOOL ReadUserList(VOID)
{
struct UserNode *upoint;
struct Userdaten user;
TEXT buffer[LEN_DOSPATH+1];
TEXT buff[LEN_REALNAME+2];
FILE *file;
/* Wenn schon eingelesen, fertig */
upoint = (struct UserNode *)KMSBase->UserList.mlh_Head;
if (upoint->Node.mln_Succ)
return TRUE;
/* Einlesen */
ObtainSemaphore(&KMSBase->UserSem);
strcpy(buffer, KMSBase->DatDir);
strcat(buffer, "KMS_UAF.DAT");
if (!(file = fopen(buffer, "r")))
{
ReleaseSemaphore(&KMSBase->UserSem);
return FALSE;
}
while(fgets(buff, LEN_NUMBER+2, file))
{
if (!(upoint = (struct UserNode *)AllocMem((ULONG)sizeof(struct UserNode), MEMF_PUBLIC|MEMF_CLEAR)))
{
Out("FATAL ERROR: couldn't AllocMem(UserNode)");
fclose(file);
ReleaseSemaphore(&KMSBase->UserSem);
return FALSE;
}
clrmem(&user, sizeof(struct Userdaten));
user.ID = (UWORD)atoi(buff);
if (fgets(buff, LEN_USERNAME+2, file))
{
if (strlen(buff))
buff[strlen(buff)-1] = '\0'; // Linefeed am Ende entfernen
strcpy(user.Name, buff);
}
if (fgets(buff, LEN_REALNAME+2, file))
{
if (strlen(buff))
buff[strlen(buff)-1] = '\0'; // Linefeed am Ende entfernen
strcpy(user.RealName, buff);
}
if (fgets(buff, LEN_STREET+2, file))
{
if (strlen(buff))
buff[strlen(buff)-1] = '\0'; // Linefeed am Ende entfernen
strcpy(user.Street, buff);
}
if (fgets(buff, LEN_CITY+2, file))
{
if (strlen(buff))
buff[strlen(buff)-1] = '\0'; // Linefeed am Ende entfernen
strcpy(user.City, buff);
}
if (fgets(buff, LEN_PHONE+2, file))
{
if (strlen(buff))
buff[strlen(buff)-1] = '\0';
strcpy(user.Phone, buff);
}
if (fgets(buff, LEN_UPROMPT+2, file))
{
if (strlen(buff))
buff[strlen(buff)-1] = '\0';
strcpy(user.Prompt, buff);
}
if (fgets(buff, LEN_NUMBER+2, file))
user.Level = (UWORD)atoi(buff);
if (fgets(buff, LEN_NUMBER+2, file))
user.Calls = (UWORD)atoi(buff);
if (fgets(buff, LEN_NUMBER+2, file))
user.LastCall = (ULONG)atol(buff);
if (fgets(buff, LEN_NUMBER+2, file))
user.CharSet = (UBYTE)atoi(buff);
if (fgets(buff, LEN_NUMBER+2, file))
user.PageLen = (UBYTE)atoi(buff);
if (fgets(buff, LEN_NUMBER+2, file))
user.LineLen = (UBYTE)atoi(buff);
if (fgets(buff, LEN_NUMBER+2, file))
user.Protocol = (UBYTE)atoi(buff);
if (fgets(buff, LEN_NUMBER+2, file))
user.Flags = (ULONG)atol(buff);
if (fgets(buff, LEN_NUMBER+2, file))
user.AccessBits = (ULONG)atol(buff);
if (fgets(buff, LEN_NUMBER+2, file))
user.Quota = (UWORD)atoi(buff);
if (fgets(buff, 15+2, file))
{
if (strlen(buff))
buff[strlen(buff)-1] = '\0';
}
upoint->UserData = user;
AddTail((struct List *)&KMSBase->UserList, (struct Node *)upoint);
}
fclose(file);
ReleaseSemaphore(&KMSBase->UserSem);
return TRUE;
}
///
/*********************************
* Userdatei schreiben *
*********************************
* I: --- *
* O: Erfolg TRUE/FALSE *
*********************************/
/// "WriteUserList"
BOOL WriteUserList(VOID)
{
struct UserNode *upoint;
TEXT buffer[LEN_DOSPATH+1];
FILE *file;
UWORD num = 0;
ObtainSemaphore(&KMSBase->UserSem);
strcpy(buffer, KMSBase->DatDir);
strcat(buffer, "KMS_UAF.DAT");
if (!(file = fopen(buffer, "w")))
{
Out("FATAL ERROR: couldn't write KMS_UAF.DAT");
ReleaseSemaphore(&KMSBase->UserSem);
return FALSE;
}
upoint = (struct UserNode *)KMSBase->UserList.mlh_Head;
while(upoint->Node.mln_Succ)
{
upoint->UserData.ID = ++num;
fprintf(file, "%d\n%s\n%s\n%s\n", upoint->UserData.ID,
upoint->UserData.Name,
upoint->UserData.RealName,
upoint->UserData.Street);
fprintf(file, "%s\n%s\n%s\n", upoint->UserData.City,
upoint->UserData.Phone,
upoint->UserData.Prompt);
fprintf(file, "%d\n%d\n%ld\n", upoint->UserData.Level,
upoint->UserData.Calls,
upoint->UserData.LastCall);
fprintf(file, "%d\n%d\n%d\n%d\n", upoint->UserData.CharSet,
upoint->UserData.PageLen,
upoint->UserData.LineLen,
upoint->UserData.Protocol);
fprintf(file, "%ld\n%ld\n%d\n\n", upoint->UserData.Flags,
upoint->UserData.AccessBits,
upoint->UserData.Quota);
upoint = upoint->Node.mln_Succ;
}
fclose(file);
ReleaseSemaphore(&KMSBase->UserSem);
return TRUE;
}
///
/*********************************
* Areadatei lesen *
* (Nur bei Programmstart) *
*********************************
* I: --- *
* O: Erfolg TRUE/FALSE *
*********************************/
/// "ReadAreaList"
BOOL ReadAreaList(VOID)
{
struct AreaNode *apoint;
struct Area area;
TEXT buffer[LEN_DOSPATH+1];
TEXT buff[LEN_MBNAME+2]; /* MBNAME ist laengstes Element */
FILE *file;
/* Wenn schon eingelesen, fertig */
apoint = (struct AreaNode *)KMSBase->AreaList.mlh_Head;
if (apoint->Node.mln_Succ)
return TRUE;
/* Einlesen */
ObtainSemaphore(&KMSBase->AreaSem);
strcpy(buffer, KMSBase->DatDir);
strcat(buffer, "KMS_AREAS.DAT");
if (!(file = fopen(buffer, "r")))
{
ReleaseSemaphore(&KMSBase->AreaSem);
return FALSE;
}
else
{
while(fgets(buff, LEN_AREANAME+2, file))
{
if (strlen(buff))
buff[strlen(buff)-1] = '\0'; /* Linefeed am Ende entfernen */
if (!(apoint = (struct AreaNode *)AllocMem((ULONG)sizeof(struct AreaNode),MEMF_PUBLIC|MEMF_CLEAR)))
{
Out("FATAL ERROR: couldn't AllocMem(AreaNode)");
fclose(file);
ReleaseSemaphore(&KMSBase->AreaSem);
return FALSE;
}
clrmem(&area, sizeof(struct Area));
strcpy(area.Name, buff);
if (fgets(buff, LEN_AREAINFO+2, file))
{
if (strlen(buff))
buff[strlen(buff)-1] = '\0'; /* Linefeed am Ende entfernen */
strcpy(area.Info, buff);
}
if (fgets(buff, LEN_MBNAME+2, file))
{
if (strlen(buff))
buff[strlen(buff)-1] = '\0';
strcpy(area.MBName, buff);
}
if (fgets(buff, LEN_FILEAREA+2, file))
{
if (strlen(buff))
buff[strlen(buff)-1] = '\0';
strcpy(area.FilePath, buff);
}
if (fgets(buff, LEN_NUMBER+2, file))
area.ID = (UWORD)atoi(buff);
if (fgets(buff, LEN_NUMBER+2, file))
area.Type = (UBYTE)atoi(buff);
if (fgets(buff, LEN_NUMBER+2, file))
area.ReadLevel = (UBYTE)atoi(buff);
if (fgets(buff, LEN_NUMBER+2, file))
area.WriteLevel = (UBYTE)atoi(buff);
if (fgets(buff, LEN_NUMBER+2, file))
area.EditLevel = (UBYTE)atoi(buff);
if (fgets(buff, LEN_NUMBER+2, file))
area.AccessBits = (ULONG)atol(buff);
if (fgets(buff, LEN_NUMBER+2, file))
area.WriteFlag = (UWORD)atol(buff);
if (fgets(buff, LEN_NUMBER+2, file))
area.QuoteStr = (UBYTE)atoi(buff);
if (fgets(buff, LEN_NUMBER+2, file))
area.PQuoteStr = (UBYTE)atoi(buff);
if (fgets(buff, LEN_NUMBER+2, file))
area.ResendStr = (UBYTE)atoi(buff);
if (fgets(buff, LEN_NUMBER+2, file))
area.ForwardStr = (UBYTE)atoi(buff);
if (fgets(buff, LEN_NUMBER+2, file))
area.OriginStr = (UBYTE)atoi(buff);
if (fgets(buff, LEN_NUMBER+2, file))
area.HoldNum = (UWORD)atoi(buff);
if (fgets(buff, LEN_NUMBER+2, file))
area.HoldDays = (UWORD)atoi(buff);
if (fgets(buff, LEN_NUMBER+2, file))
area.Mother = (UWORD)atoi(buff);
if (fgets(buff, LEN_NUMBER+2, file))
area.Daughter = (UWORD)atoi(buff);
if (fgets(buff, LEN_NUMBER+2, file))
area.Next = (UWORD)atoi(buff);
apoint->AreaData = area;
AddTail((struct List *)&KMSBase->AreaList,(struct Node *)apoint);
}
fclose(file);
}
ReleaseSemaphore(&KMSBase->AreaSem);
return TRUE;
}
///
/*********************************
* Areadatei schreiben *
*********************************
* I: --- *
* O: Erfolg TRUE/FALSE *
*********************************/
/// "WriteAreaList"
BOOL WriteAreaList(VOID)
{
struct AreaNode *apoint;
TEXT buff[LEN_DOSPATH+1];
FILE *file;
ObtainSemaphore(&KMSBase->AreaSem);
strcpy(buff, KMSBase->DatDir);
strcat(buff, "KMS_AREAS.DAT");
file = fopen(buff, "w");
if (!file)
{
Out("FATAL ERROR: couldn't write KMS_AREAS.DAT");
ReleaseSemaphore(&KMSBase->AreaSem);
return FALSE;
}
apoint = (struct AreaNode *)KMSBase->AreaList.mlh_Head;
while(apoint->Node.mln_Succ)
{
fprintf(file,"%s\n%s\n%s\n%s\n", apoint->AreaData.Name,
apoint->AreaData.Info,
apoint->AreaData.MBName,
apoint->AreaData.FilePath);
fprintf(file,"%d\n%d\n%d\n%d\n%d\n", apoint->AreaData.ID,
apoint->AreaData.Type,
apoint->AreaData.ReadLevel,
apoint->AreaData.WriteLevel,
apoint->AreaData.EditLevel);
fprintf(file,"%ld\n%d\n", apoint->AreaData.AccessBits,
apoint->AreaData.WriteFlag);
fprintf(file,"%d\n%d\n%d\n%d\n%d\n", apoint->AreaData.QuoteStr,
apoint->AreaData.PQuoteStr,
apoint->AreaData.ResendStr,
apoint->AreaData.ForwardStr,
apoint->AreaData.OriginStr);
fprintf(file,"%d\n", apoint->AreaData.HoldNum);
fprintf(file,"%d\n", apoint->AreaData.HoldDays);
fprintf(file,"%d\n%d\n%d\n", apoint->AreaData.Mother,
apoint->AreaData.Daughter,
apoint->AreaData.Next);
apoint = apoint->Node.mln_Succ;
}
fclose(file);
ReleaseSemaphore(&KMSBase->AreaSem);
return TRUE;
}
///
/*********************************
* Access Control List einlesen *
* (Nur bei Programmstart) *
*********************************
* I: --- *
* O: Erfolg? TRUE/FALSE *
*********************************/
/// "ReadAccessList"
BOOL ReadAccessList(VOID)
{
struct ACLNode *acl;
TEXT buffer[LEN_DOSPATH+1];
TEXT buff[LEN_ACLLINE+1];
FILE *file;
UWORD access = 0;
UBYTE n;
ObtainSemaphore(&KMSBase->SaveSem);
for(n = 0; n < 26; n++)
KMSBase->ACLIndex[n] = NULL;
n = 0;
strcpy(buffer, KMSBase->DatDir);
strcat(buffer, "KMS_ACL.DAT");
if (!(file = fopen(buffer, "r")))
{
ReleaseSemaphore(&KMSBase->SaveSem);
return TRUE;
}
else
{
while(fgets(buff, LEN_ACLLINE+1, file))
{
if (strlen(buff))
buff[strlen(buff)-1] = '\0'; /* Linefeed am Ende entfernen */
if (!(acl = (struct ACLNode *)AllocMem((ULONG)sizeof(struct ACLNode),MEMF_PUBLIC|MEMF_CLEAR)))
{
Out("FATAL ERROR: couldn't AllocMem(ACLNode)");
fclose(file);
ReleaseSemaphore(&KMSBase->SaveSem);
return FALSE;
}
sscanf(buff, "%31s %hd %hd", acl->UserName, &(acl->AreaID), &access);
acl->Access = access;
AddTail((struct List *)&KMSBase->AccessList, (struct Node *)acl);
n = toupper(acl->UserName[0]) - 'A';
if (n > 25)
n = 25;
if (!KMSBase->ACLIndex[n])
KMSBase->ACLIndex[n] = acl;
}
fclose(file);
}
ReleaseSemaphore(&KMSBase->SaveSem);
return TRUE;
}
///
/*********************************
* Access Control List sichern *
*********************************
* I: --- *
* O: Erfolg? TRUE/FALSE *
*********************************/
/// "WriteAccessList"
BOOL WriteAccessList(VOID)
{
struct ACLNode *acl;
TEXT buffer[LEN_DOSPATH+1];
FILE *file;
ObtainSemaphore(&KMSBase->SaveSem);
strcpy(buffer, KMSBase->DatDir);
strcat(buffer, "KMS_ACL.DAT");
file = fopen(buffer, "w");
if (!file)
{
Out("FATAL ERROR: couldn't write KMS_ACL.DAT");
ReleaseSemaphore(&KMSBase->SaveSem);
return FALSE;
}
acl = (struct ACLNode *)KMSBase->AccessList.mlh_Head;
while(acl->Node.mln_Succ)
{
fprintf(file, "%s %d %d\n", acl->UserName, acl->AreaID, acl->Access);
acl = acl->Node.mln_Succ;
}
fclose(file);
ReleaseSemaphore(&KMSBase->SaveSem);
return TRUE;
}
///
/******************************************
* System/Userdaten sichern *
******************************************
* I: --- *
* O: --- *
******************************************/
/// "SaveData"
VOID SaveData(VOID)
{
if (KMSBase->Modified & MODIFIED_AREAS)
WriteAreaList();
if (KMSBase->Modified & MODIFIED_ACL)
WriteAccessList();
WriteUserList();
WriteSysDat();
KMSBase->Modified = 0;
}
///
/****************************
* System.dat einlesen *
****************************
* I: --- *
* O: --- *
****************************/
/// "ReadSysDat"
VOID ReadSysDat(VOID)
{
TEXT dos[LEN_DOSPATH+1];
TEXT buff[LEN_NUMBER+LEN_ACCBITNAME+2];
UWORD n;
FILE *datei;
ObtainSemaphore(&KMSBase->SaveSem);
strcpy(dos, KMSBase->DatDir);
strcat(dos, "KMS_SYSTEM.DAT");
if (datei = fopen(dos, "r"))
{
fgets(buff, LEN_NUMBER+2, datei);
KMSBase->SystemStartups = atol(buff) + 1;
for(n = 0; n < 32; n++)
{
*buff = '\0';
if (fgets(buff, LEN_ACCBITNAME+2, datei))
buff[strlen(buff)-1] = '\0';
if (!strlen(buff))
sprintf(KMSBase->AccBitNames[n], "[Bit#%02d]", n+1);
else
strcpy(KMSBase->AccBitNames[n], buff);
}
fclose(datei);
}
else
{
KMSBase->SystemStartups = 1;
for(n = 0; n < 32; n++)
sprintf(KMSBase->AccBitNames[n], "[Bit#%02d]", n+1);
}
ReleaseSemaphore(&KMSBase->SaveSem);
}
///
/***************************
* Systemdaten speichern *
***************************
* I: --- *
* O: --- *
***************************/
/// "WriteSysDat"
VOID WriteSysDat(VOID)
{
FILE *datei;
TEXT dos[LEN_DOSPATH+1];
UBYTE n;
ObtainSemaphore(&KMSBase->SaveSem);
strcpy(dos, KMSBase->DatDir);
strcat(dos, "KMS_SYSTEM.DAT");
datei = fopen(dos, "w");
if (datei)
{
fprintf(datei, "%ld\n", KMSBase->SystemStartups);
for(n = 0; n < 32; n++)
fprintf(datei, "%s\n", KMSBase->AccBitNames[n]);
fclose(datei);
}
else
Out("FATAL ERROR: couldn't write KMS_SYSTEM.DAT");
ReleaseSemaphore(&KMSBase->SaveSem);
}
///
/************************************
* Master wartet auf Einsamkeit ;-) *
************************************
* I: --- *
* O: Erfolg Ja/Nein *
************************************/
/// "WaitUntilAlone"
BOOL WaitUntilAlone(VOID)
{
/* Warten, bis kein Slave mehr anwesend */
/* Solange noch ein Eintrag in Memberliste... */
while(KMSBase->MemberList.mlh_Head->mln_Succ)
{
Delay(50);
dispRexxPort();
}
return TRUE;
}
///
/******************
* Sendeschluß... *
******************
*** I: Exit-Code *
*** O: --- *
******************/
/// "Sense"
VOID Sense(UBYTE exitcode)
{
/* Rexx-Port killen */
dnRexxPort();
/* Speicher-Freigaben */
if (KMSBase)
{
if (KMSBase->SysMsgs)
FreeVec(KMSBase->SysMsgs);
/* Befehlsliste freigeben */
struct CommandNode *cpoint = KMSBase->CommandList.mlh_Head;
while(cpoint->Node.mln_Succ)
{
struct CommandNode *nextcpoint = cpoint->Node.mln_Succ;
Remove((struct Node *)cpoint);
FreeMem(cpoint, (ULONG)sizeof(struct CommandNode));
cpoint = nextcpoint;
}
/* Access Control List freigeben */
struct ACLNode *acl = KMSBase->AccessList.mlh_Head;
while(acl->Node.mln_Succ)
{
struct ACLNode *nextacl = acl->Node.mln_Succ;
Remove((struct Node *)acl);
FreeMem(acl, (ULONG)sizeof(struct ACLNode));
acl = nextacl;
}
/* Weitere Freigaben */
if (KMSBase->BinDir)
free(KMSBase->BinDir);
if (KMSBase->TxtDir)
free(KMSBase->TxtDir);
if (KMSBase->RexxDir)
free(KMSBase->RexxDir);
if (KMSBase->LogDir)
free(KMSBase->LogDir);
if (KMSBase->DoorDir)
free(KMSBase->DoorDir);
if (KMSBase->TempDir)
free(KMSBase->TempDir);
if (KMSBase->ModemResetString)
free(KMSBase->ModemResetString);
if (KMSBase->ModemHangupString)
free(KMSBase->ModemHangupString);
if (KMSBase->ModemRingString)
free(KMSBase->ModemRingString);
if (KMSBase->ModemConnectString)
free(KMSBase->ModemConnectString);
if (KMSBase->ModemSpeedString)
free(KMSBase->ModemSpeedString);
if (KMSBase->AnswerPhoneString)
free(KMSBase->AnswerPhoneString);
if (KMSBase->MsgListLine);
free(KMSBase->MsgListLine);
if (KMSBase->FileListLine);
free(KMSBase->FileListLine);
if (KMSBase->AreaListPath);
free(KMSBase->AreaListPath);
if (KMSBase->AreaListInfo);
free(KMSBase->AreaListInfo);
UBYTE n;
for(n = 0; n < 4; n++)
if (KMSBase->MsgHead[n])
free(KMSBase->MsgHead[n]);
for(n = 0; n < 15; n++)
if (KMSBase->MsgInfos[n])
free(KMSBase->MsgInfos[n]);
/* Von der Basis abmelden */
ReleaseSemaphore(&KMSBase->BaseSem);
/* KMSBase gegebenenfalls wieder entfernen */
Forbid();
if (KMSBase = (struct KMSBase *)FindSemaphore(KMSBASENAME))
{
if (AttemptSemaphore(&KMSBase->BaseSem))
{
Permit();
/* Arealiste freigeben */
struct AreaNode *apoint = KMSBase->AreaList.mlh_Head;
while(apoint->Node.mln_Succ)
{
struct AreaNode *nextapoint = apoint->Node.mln_Succ;
Remove((struct Node *)apoint);
FreeMem(apoint, (ULONG)sizeof(struct AreaNode));
apoint = nextapoint;
}
/* Userliste freigeben */
struct UserNode *upoint = KMSBase->UserList.mlh_Head;
while(upoint->Node.mln_Succ)
{
struct UserNode *nextupoint = upoint->Node.mln_Succ;
Remove((struct Node *)upoint);
FreeMem(upoint, (ULONG)sizeof(struct UserNode));
upoint = nextupoint;
}
if (KMSBase->DatDir)
FreeMem(KMSBase->DatDir, strlen(KMSBase->DatDir) + 1);
if (KMSBase->UserDir)
FreeMem(KMSBase->UserDir, strlen(KMSBase->UserDir) + 1);
RemSemaphore(&KMSBase->BaseSem);
ObtainSemaphore(&KMSBase->UserSem);
ReleaseSemaphore(&KMSBase->UserSem);
ObtainSemaphore(&KMSBase->AreaSem);
ReleaseSemaphore(&KMSBase->AreaSem);
ObtainSemaphore(&KMSBase->SaveSem);
ReleaseSemaphore(&KMSBase->SaveSem);
ReleaseSemaphore(&KMSBase->BaseSem);
FreeMem(KMSBase->BaseSem.ss_Link.ln_Name, sizeof(KMSBASENAME)+1);
FreeMem(KMSBase, sizeof(struct KMSBase));
}
else
Permit();
}
else
Permit();
}
if (SysUMSAccount)
UMSLogout(SysUMSAccount);
if (ShutDown == SHUTDOWN_IMMED_SYS)
UMSServerControl(NULL, UMSSC_Quit);
if (StdOut)
Close(StdOut);
struct MsgPort *serverport;
Forbid();
if (serverport = FindPort(ServerPort))
{
struct Message *smsg;
RemPort(serverport);
while(smsg = GetMsg(serverport))
ReplyMsg(smsg);
DeletePort(serverport);
}
Permit();
exit(exitcode);
}
///
/*******************
* Standardausgabe *
*******************
*** I: Text *
*** O: --- *
*******************/
/// "Out"
VOID Out(STRPTR str)
{
if (StdOut && str)
{
Write(StdOut, str, (LONG)strlen(str));
Write(StdOut, "\n", 1);
}
}
///
/*******************************************
* Zeile aus SysMsgList lesen *
*******************************************
* I: ZielBuffer, Max. Länge *
* O: Neue Position in SysMsg-Datei *
*******************************************/
/// "GetSysMsgLine"
STRPTR GetSysMsgLine(STRPTR sysmsgdat, STRPTR buff, UWORD maxlen)
{
STRPTR buffalt = buff;
TEXT c = *(sysmsgdat++);
/* Zeile einlesen */
maxlen++;
while(c != '\n' && c > 0 && --maxlen)
{
*(buff++) = c;
c = *(sysmsgdat++);
}
*buff = '\0';
/* Falls Zeile zu lang, Rest der Zeile ueberlesen */
if (c != '\n')
while(c != '\n' && c > 0)
c = *(sysmsgdat++);
if (c == '\n')
return sysmsgdat;
else
return NULL;
}
///
/*********************************
* Areadatei initialisieren *
*********************************
* I: --- *
* O: Erfolg TRUE/FALSE *
*********************************/
/// "InitAreaFile"
BOOL InitAreaFile(VOID)
{
TEXT buffer[LEN_DOSPATH+1];
struct Area area;
FILE *file;
ObtainSemaphore(&KMSBase->AreaSem);
strcpy(buffer, KMSBase->DatDir);
strcat(buffer, "KMS_AREAS.DAT");
if (!(file = fopen(buffer, "w")))
{
Out("FATAL ERROR: couldn't create KMS_AREAS.DAT");
ReleaseSemaphore(&KMSBase->AreaSem);
return FALSE;
}
clrmem(&area, sizeof(struct Area));
strcpy(area.Name, "PRIVAT");
strcpy(area.Info, "- Private Mail -");
strcpy(area.MBName, "");
strcpy(area.FilePath, "KMS:Files/");
area.ID = 1;
area.Type = ATYPE_PRIVATE;
area.ReadLevel = 1;
area.WriteLevel = 1;
area.EditLevel = 255;
area.QuoteStr = 1;
area.PQuoteStr = 1;
area.ResendStr = 1;
area.ForwardStr = 1;
area.OriginStr = 1;
area.HoldNum = 0;
area.HoldDays = 0;
fprintf(file, "%s\n%s\n%s\n%s\n", area.Name,
area.Info,
area.MBName,
area.FilePath);
fprintf(file, "%d\n%d\n%d\n%d\n%d\n", area.ID,
area.Type,
area.ReadLevel,
area.WriteLevel,
area.EditLevel);
fprintf(file, "%ld\n%d\n", area.AccessBits,
area.WriteFlag);
fprintf(file, "%d\n%d\n%d\n%d\n%d\n", area.QuoteStr,
area.PQuoteStr,
area.ResendStr,
area.ForwardStr,
area.OriginStr);
fprintf(file, "%d\n", area.HoldNum);
fprintf(file, "%d\n", area.HoldDays);
fprintf(file, "%d\n%d\n%d\n", area.Mother,
area.Daughter,
area.Next);
fclose(file);
ReleaseSemaphore(&KMSBase->AreaSem);
return TRUE;
}
///
/*********************************
* Neue Userdatei anlegen *
*********************************
* I: --- *
* O: Erfolg TRUE/FALSE *
*********************************/
/// "InitUAF"
BOOL InitUAF(VOID)
{
FILE *file;
struct Userdaten user;
TEXT buffer[LEN_DOSPATH+1];
TEXT buff[LEN_DOSPATH*2+LEN_USERNAME+21+1];
BPTR lock;
ObtainSemaphore(&KMSBase->UserSem);
strcpy(buffer, KMSBase->DatDir);
strcat(buffer, "KMS_UAF.DAT");
if (!(file = fopen(buffer, "w")))
{
Out("FATAL ERROR: couldn't create KMS_UAF.DAT");
ReleaseSemaphore(&KMSBase->UserSem);
return FALSE;
}
/* KMS-System-Account */
clrmem(&user, sizeof(struct Userdaten));
user.ID = 1;
user.CharSet = 0;
user.Flags = UF_EMU_ANSI|UF_EDIT_INSERT|UF_AUTO_LIST|UF_AUTO_AREALIST|UF_RMODE_NEW|UF_SCREEN_ED;
strcpy(user.Name, "System");
strcpy(user.RealName, "KMS System");
strcpy(user.City, "Ankh-Morpork");
user.Level = 255;
user.LineLen = 80;
user.PageLen = 25;
user.Quota = 10;
strcpy(user.Prompt, "System> ");
fprintf(file, "%d\n%s\n%s\n%s\n", user.ID,
user.Name,
user.RealName,
user.Street);
fprintf(file, "%s\n%s\n%s\n", user.City,
user.Phone,
user.Prompt);
fprintf(file, "%d\n%d\n%ld\n", user.Level,
user.Calls,
user.LastCall);
fprintf(file, "%d\n%d\n%d\n%d\n", user.CharSet,
user.PageLen,
user.LineLen,
user.Protocol);
fprintf(file, "%ld\n%ld\n%d\n\n", user.Flags,
user.AccessBits,
user.Quota);
/* Neues Paßwort in ums.config festhalten */
WriteUMSConfigTags(SysUMSAccount, UMSTAG_CfgUser, user.RealName,
UMSTAG_CfgName, "PASSWORD",
UMSTAG_CfgData, "",
TAG_DONE);
/* User-Directory anlegen */
strcpy(buffer, KMSBase->UserDir);
strcat(buffer, user.Name);
if (lock = CreateDir(buffer))
{
UnLock(lock);
/* LOGIN.COM kopieren */
sprintf(buff, "Copy >NIL: %sLOGIN.COM %s", KMSBase->UserDir, buffer);
system(buff);
}
/* KMS-Default-Account */
clrmem(&user, sizeof(struct Userdaten));
user.ID = 2;
user.CharSet = 0;
user.Flags = UF_EMU_ANSI|UF_EDIT_INSERT|UF_AUTO_LIST|UF_AUTO_AREALIST|UF_RMODE_NEW|UF_SCREEN_ED;
strcpy(user.Name, "Default");
strcpy(user.RealName, "KMS Default");
strcpy(user.City, "Pern");
user.Level = 10;
user.LineLen = 80;
user.PageLen = 25;
user.Quota = 10;
strcpy(user.Prompt, "[%p]> ");
fprintf(file, "%d\n%s\n%s\n%s\n", user.ID,
user.Name,
user.RealName,
user.Street);
fprintf(file, "%s\n%s\n%s\n", user.City,
user.Phone,
user.Prompt);
fprintf(file, "%d\n%d\n%ld\n", user.Level,
user.Calls,
user.LastCall);
fprintf(file, "%d\n%d\n%d\n%d\n", user.CharSet,
user.PageLen,
user.LineLen,
user.Protocol);
fprintf(file, "%ld\n%ld\n%d\n\n", user.Flags,
user.AccessBits,
user.Quota);
/* Neues Paßwort in ums.config festhalten */
WriteUMSConfigTags(SysUMSAccount, UMSTAG_CfgUser, user.RealName,
UMSTAG_CfgName, "PASSWORD",
UMSTAG_CfgData, "",
TAG_DONE);
/* User-Directory anlegen */
strcpy(buffer, KMSBase->UserDir);
strcat(buffer, user.Name);
if (lock = CreateDir(buffer))
{
UnLock(lock);
/* LOGIN.COM kopieren */
sprintf(buff, "Copy >NIL: %sLOGIN.COM %s", KMSBase->UserDir, buffer);
system(buff);
}
/* GAST-Account */
clrmem(&user, sizeof(struct Userdaten));
user.ID = 3;
user.CharSet = 0;
user.Flags = UF_EMU_ANSI|UF_EDIT_INSERT|UF_AUTO_LIST|UF_AUTO_AREALIST|UF_RMODE_NEW|UF_SCREEN_ED;
strcpy(user.Name, "Gast");
strcpy(user.RealName, "KMS Gast");
strcpy(user.City, "Ankh-Morpork");
user.Level = 1;
user.LineLen = 80;
user.PageLen = 25;
user.Quota = 0;
strcpy(user.Prompt, "[%p]> ");
fprintf(file, "%d\n%s\n%s\n%s\n", user.ID,
user.Name,
user.RealName,
user.Street);
fprintf(file, "%s\n%s\n%s\n", user.City,
user.Phone,
user.Prompt);
fprintf(file, "%d\n%d\n%ld\n", user.Level,
user.Calls,
user.LastCall);
fprintf(file, "%d\n%d\n%d\n%d\n", user.CharSet,
user.PageLen,
user.LineLen,
user.Protocol);
fprintf(file, "%ld\n%ld\n%d\n\n", user.Flags,
user.AccessBits,
user.Quota);
/* Neues Paßwort in ums.config festhalten */
WriteUMSConfigTags(SysUMSAccount, UMSTAG_CfgUser, user.RealName,
UMSTAG_CfgName, "PASSWORD",
UMSTAG_CfgData, "",
TAG_DONE);
/* User-Directory anlegen */
strcpy(buffer, KMSBase->UserDir);
strcat(buffer, user.Name);
if (lock = CreateDir(buffer))
UnLock(lock);
fclose(file);
ReleaseSemaphore(&KMSBase->UserSem);
return TRUE;
}
///
/********************************
* KMSBase besorgen *
********************************
* I: --- *
* O: struct KMSBase * *
********************************/
/// "GetKMSBase"
struct KMSBase *GetKMSBase(VOID)
{
STRPTR bname;
/* KMSBase erzeugen, falls nicht vorhanden */
Forbid();
if (!(KMSBase = (struct KMSBase *)FindSemaphore(KMSBASENAME)))
{
bname = AllocMem((ULONG)sizeof(KMSBASENAME)+1, MEMF_PUBLIC|MEMF_CLEAR);
if (bname)
{
strcpy(bname, KMSBASENAME);
if (KMSBase = AllocMem((ULONG)sizeof(struct KMSBase), MEMF_PUBLIC|MEMF_CLEAR))
{
KMSBase->BaseSem.ss_Link.ln_Pri = 0;
KMSBase->BaseSem.ss_Link.ln_Name = bname;
KMSBase->UserSem.ss_Link.ln_Pri = 0;
KMSBase->UserSem.ss_Link.ln_Name = NULL;
KMSBase->AreaSem.ss_Link.ln_Pri = 0;
KMSBase->AreaSem.ss_Link.ln_Name = NULL;
KMSBase->SaveSem.ss_Link.ln_Pri = 0;
KMSBase->SaveSem.ss_Link.ln_Name = NULL;
NewList((struct List *)&KMSBase->AreaList);
NewList((struct List *)&KMSBase->UserList);
AddSemaphore(&KMSBase->BaseSem);
InitSemaphore(&KMSBase->UserSem);
InitSemaphore(&KMSBase->AreaSem);
InitSemaphore(&KMSBase->SaveSem);
ObtainSemaphore(&KMSBase->BaseSem);
Permit();
TEXT varbuff[32] = "";
TEXT pwbuff[32] = "";
GetVar("KMSMB", varbuff, sizeof(varbuff), NULL);
GetVar("KMSPWD", pwbuff, sizeof(pwbuff), NULL);
if (!(SysUMSAccount = UMSRLogin(varbuff, "KMS", pwbuff)))
{
ReleaseSemaphore(&KMSBase->BaseSem);
Out("FATAL ERROR: couldn't log into UMS");
return NULL;
}
STRPTR string;
if (string = ReadUMSConfigTags(SysUMSAccount, UMSTAG_CfgName, "KMS.datdir", TAG_DONE))
{
KMSBase->DatDir = AllocMem((ULONG)(strlen(string)+1), MEMF_PUBLIC|MEMF_CLEAR);
if (KMSBase->DatDir)
strcpy(KMSBase->DatDir, string);
FreeUMSConfig(SysUMSAccount, string);
if (!KMSBase->DatDir)
{
Out("FATAL ERROR: out of memory");
return NULL;
}
}
else
{
KMSBase->DatDir = AllocMem((ULONG)(strlen("Data/")+1), MEMF_PUBLIC|MEMF_CLEAR);
if (KMSBase->DatDir)
strcpy(KMSBase->DatDir, "Data/");
else
{
Out("FATAL ERROR: out of memory");
return NULL;
}
}
if (string = ReadUMSConfigTags(SysUMSAccount, UMSTAG_CfgName, "KMS.userdir", TAG_DONE))
{
KMSBase->UserDir = AllocMem((ULONG)(strlen(string)+1), MEMF_PUBLIC|MEMF_CLEAR);
if (KMSBase->UserDir)
strcpy(KMSBase->UserDir, string);
FreeUMSConfig(SysUMSAccount, string);
if (!KMSBase->UserDir)
{
Out("FATAL ERROR: out of memory");
return NULL;
}
}
else
{
KMSBase->UserDir = AllocMem((ULONG)(strlen("User/")+1), MEMF_PUBLIC|MEMF_CLEAR);
if (KMSBase->UserDir)
strcpy(KMSBase->UserDir, "User/");
else
{
Out("FATAL ERROR: out of memory");
return NULL;
}
}
ReleaseSemaphore(&KMSBase->BaseSem);
ObtainSemaphoreShared(&KMSBase->BaseSem);
}
else
{
Permit();
if (bname)
FreeMem(bname, sizeof(KMSBASENAME)+1);
Out("FATAL ERROR: out of memory");
return NULL;
}
}
else
{
Permit();
Out("FATAL ERROR: out of memory");
return NULL;
}
}
else
{
ObtainSemaphoreShared(&KMSBase->BaseSem);
Permit();
}
/* Diverse Initialisierungen */
KMSBase->Modified = 0;
/* Systemlisten initialisieren */
NewList((struct List *)&KMSBase->MemberList);
NewList((struct List *)&KMSBase->CommandList);
NewList((struct List *)&KMSBase->AccessList);
/* Default-Konfiguration einstellen */
KMSBase->LoginTries = 3;
KMSBase->InputTimeout = 300;
KMSBase->InputTimeoutWarnings = 2;
KMSBase->MaxConnectTime = 120;
KMSBase->MaxConnectWarnings = 3;
KMSBase->MaxHistCount = 30;
KMSBase->XOFFTimeout = 300;
strcpy(KMSBase->AFlags, "FPNRWE");
strcpy(KMSBase->YNText, "YN");
strcpy(KMSBase->MoreText, "YNC");
strcpy(KMSBase->MorePrompt, "More [Y]/N/C?");
/* Vorhandene Konfigurations-Token aus ums.config lesen */
if (!SysUMSAccount)
{
TEXT varbuff[32] = "";
GetVar("KMSMB", varbuff, sizeof(varbuff), NULL);
if (!(SysUMSAccount = UMSRLogin(varbuff, "KMS", "")))
{
Out("FATAL ERROR: couldn't log into UMS");
return NULL;
}
}
STRPTR string;
if (string = ReadUMSConfigTags(SysUMSAccount, UMSTAG_CfgName, "KMS.loglevel", TAG_DONE))
{
KMSBase->LogLevel = (UBYTE)atoi(string);
FreeUMSConfig(SysUMSAccount, string);
}
if (string = ReadUMSConfigTags(SysUMSAccount, UMSTAG_CfgName, "KMS.logintries", TAG_DONE))
{
if (atoi(string))
KMSBase->LoginTries = atoi(string);
FreeUMSConfig(SysUMSAccount, string);
}
if (string = ReadUMSConfigTags(SysUMSAccount, UMSTAG_CfgName, "KMS.inputtimeout", TAG_DONE))
{
if (atoi(string))
KMSBase->InputTimeout = atoi(string);
FreeUMSConfig(SysUMSAccount, string);
}
if (string = ReadUMSConfigTags(SysUMSAccount, UMSTAG_CfgName, "KMS.inputtimeoutwarnings", TAG_DONE))
{
KMSBase->InputTimeoutWarnings = atoi(string);
FreeUMSConfig(SysUMSAccount, string);
}
if (string = ReadUMSConfigTags(SysUMSAccount, UMSTAG_CfgName, "KMS.maxconnecttime", TAG_DONE))
{
KMSBase->MaxConnectTime = atoi(string);
FreeUMSConfig(SysUMSAccount, string);
}
if (string = ReadUMSConfigTags(SysUMSAccount, UMSTAG_CfgName, "KMS.maxconnectwarnings", TAG_DONE))
{
KMSBase->MaxConnectWarnings = atoi(string);
FreeUMSConfig(SysUMSAccount, string);
}
if (string = ReadUMSConfigTags(SysUMSAccount, UMSTAG_CfgName, "KMS.maxhistcount", TAG_DONE))
{
KMSBase->MaxHistCount = atoi(string);
FreeUMSConfig(SysUMSAccount, string);
}
if (string = ReadUMSConfigTags(SysUMSAccount, UMSTAG_CfgName, "KMS.xofftimeout", TAG_DONE))
{
KMSBase->XOFFTimeout = atoi(string);
FreeUMSConfig(SysUMSAccount, string);
}
if (string = ReadUMSConfigTags(SysUMSAccount, UMSTAG_CfgName, "KMS.bindir", TAG_DONE))
{
KMSBase->BinDir = strdup(string);
FreeUMSConfig(SysUMSAccount, string);
}
else
KMSBase->BinDir = strdup("Bin/");
if (!KMSBase->BinDir)
{
Out("FATAL ERROR: out of memory");
return NULL;
}
if (string = ReadUMSConfigTags(SysUMSAccount, UMSTAG_CfgName, "KMS.txtdir", TAG_DONE))
{
KMSBase->TxtDir = strdup(string);
FreeUMSConfig(SysUMSAccount, string);
}
else
KMSBase->TxtDir = strdup("Text/");
if (!KMSBase->TxtDir)
{
Out("FATAL ERROR: out of memory");
return NULL;
}
if (string = ReadUMSConfigTags(SysUMSAccount, UMSTAG_CfgName, "KMS.rexxdir", TAG_DONE))
{
KMSBase->RexxDir = strdup(string);
FreeUMSConfig(SysUMSAccount, string);
}
else
KMSBase->RexxDir = strdup("Rexx/");
if (!KMSBase->RexxDir)
{
Out("FATAL ERROR: out of memory");
return NULL;
}
if (string = ReadUMSConfigTags(SysUMSAccount, UMSTAG_CfgName, "KMS.logdir", TAG_DONE))
{
KMSBase->LogDir = strdup(string);
FreeUMSConfig(SysUMSAccount, string);
}
else
KMSBase->LogDir = strdup("Data/");
if (!KMSBase->LogDir)
{
Out("FATAL ERROR: out of memory");
return NULL;
}
if (string = ReadUMSConfigTags(SysUMSAccount, UMSTAG_CfgName, "KMS.doordir", TAG_DONE))
{
KMSBase->DoorDir = strdup(string);
FreeUMSConfig(SysUMSAccount, string);
}
else
KMSBase->DoorDir = strdup("Doors/");
if (!KMSBase->DoorDir)
{
Out("FATAL ERROR: out of memory");
return NULL;
}
if (string = ReadUMSConfigTags(SysUMSAccount, UMSTAG_CfgName, "KMS.tempdir", TAG_DONE))
{
KMSBase->TempDir = strdup(string);
FreeUMSConfig(SysUMSAccount, string);
}
else
KMSBase->TempDir = strdup("T:");
if (!KMSBase->TempDir)
{
Out("FATAL ERROR: out of memory");
return NULL;
}
if (string = ReadUMSConfigTags(SysUMSAccount, UMSTAG_CfgName, "KMS.modemreset", TAG_DONE))
{
KMSBase->ModemResetString = strdup(string);
FreeUMSConfig(SysUMSAccount, string);
}
else
KMSBase->ModemResetString = strdup("ATZ%M");
if (!KMSBase->ModemResetString)
{
Out("FATAL ERROR: out of memory");
return NULL;
}
if (string = ReadUMSConfigTags(SysUMSAccount, UMSTAG_CfgName, "KMS.modemhangup", TAG_DONE))
{
KMSBase->ModemHangupString = strdup(string);
FreeUMSConfig(SysUMSAccount, string);
}
else
KMSBase->ModemHangupString = strdup("%P%P+++%P%PATH%M");
if (!KMSBase->ModemHangupString)
{
Out("FATAL ERROR: out of memory");
return NULL;
}
if (string = ReadUMSConfigTags(SysUMSAccount, UMSTAG_CfgName, "KMS.modemring", TAG_DONE))
{
KMSBase->ModemRingString = strdup(string);
FreeUMSConfig(SysUMSAccount, string);
}
else
KMSBase->ModemRingString = strdup("RING");
if (!KMSBase->ModemRingString)
{
Out("FATAL ERROR: out of memory");
return NULL;
}
if (string = ReadUMSConfigTags(SysUMSAccount, UMSTAG_CfgName, "KMS.modemconnect", TAG_DONE))
{
KMSBase->ModemConnectString = strdup(string);
FreeUMSConfig(SysUMSAccount, string);
}
else
KMSBase->ModemConnectString = strdup("CONNECT");
if (!KMSBase->ModemConnectString)
{
Out("FATAL ERROR: out of memory");
return NULL;
}
if (string = ReadUMSConfigTags(SysUMSAccount, UMSTAG_CfgName, "KMS.modemanswer", TAG_DONE))
{
KMSBase->AnswerPhoneString = strdup(string);
FreeUMSConfig(SysUMSAccount, string);
}
else
KMSBase->AnswerPhoneString = strdup("ATA%M");
if (!KMSBase->AnswerPhoneString)
{
Out("FATAL ERROR: out of memory");
return NULL;
}
/* Div. Text-Daten aus KMS_SYSTEM.TXT lesen */
if (!GetData())
return NULL;
/* Systemdaten einlesen */
ReadSysDat();
/* Befehlsliste einlesen */
TEXT line[82], dos[LEN_DOSPATH+1];
struct CommandNode *cpoint;
FILE *datei;
strcpy(dos, KMSBase->DatDir);
strcat(dos, "KMS_COMMANDS.DAT");
if (!(datei = fopen(dos, "r")))
{
Out("FATAL ERROR: couldn't open KMS_COMMANDS.DAT");
return NULL;
}
else
{
while(fgets(line, 82, datei))
{
if (!(cpoint = (struct CommandNode *)AllocMem((ULONG)sizeof(struct CommandNode), MEMF_PUBLIC|MEMF_CLEAR)))
{
Out("FATAL ERROR: couldn't AllocMem(CommandNode)");
fclose(datei);
return NULL;
}
sscanf(line, "%15s %30s %hd %hd", cpoint->Name, cpoint->DisplayName, &(cpoint->ID), &(cpoint->Level));
AddTail((struct List *)&KMSBase->CommandList, (struct Node *)cpoint);
}
fclose(datei);
}
/* Zeichenkonvertiertabellen einlesen */
UBYTE n;
for(n = 0; n < 10; n++)
GetCharTable(n);
/* Arealiste einlesen oder anlegen, falls nicht vorhanden */
if (!ReadAreaList())
{
InitAreaFile();
if (!ReadAreaList())
{
Out("FATAL ERROR: couldn't create or read KMS_AREAS.DAT");
return NULL;
}
}
/* Userliste einlesen oder anlegen, falls nicht vorhanden */
if (!ReadUserList())
{
InitUAF();
if (!ReadUserList())
{
Out("FATAL ERROR: couldn't create or read KMS_UAF.DAT");
return NULL;
}
}
/* Access Control List einlesen */
if (!ReadAccessList())
return NULL;
return KMSBase;
}
///